package GUI;

import accesodatos.FachadaDW;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.jdbc.JDBCPieDataset;
import org.jfree.data.xy.XYSeries;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Ana Maria
 */

public class PromedioTiempoCitas extends JFrame {

    BufferedImage image = null;
    private JFreeChart grafico;
    JPanel contentPane;
    FachadaDW dw = new FachadaDW();

    public PromedioTiempoCitas() {

        super("Colombia Saludable - Promedio de tiempo de espera");

        this.setLayout(new BorderLayout());
        this.setSize(800, 600);
        this.setVisible(true);

        contentPane = new JPanel(new BorderLayout());
        contentPane.setSize(this.getSize());
        contentPane.setVisible(true);

        this.add(contentPane);
    }
    
    public ArrayList<Double> getPromCitasEspPorAño(String anio, String tipoGrafica, String estrato, String sexo, String estado_civil, String nivel_escolaridad){
    
       
        String clauseEstratoACE;
        String clauseSexoACE;
        String clauseEstado_civilACE;
        String clauseNivel_EscolaridadACE;
        ArrayList<Double> promedios = new ArrayList();



        Connection conn = dw.conectar();

        try {

            if (estrato.equals("") || estrato.equals(" ")) {

                clauseEstratoACE = "";
            } else {

                clauseEstratoACE = "AND ((SELECT  estrato FROM dimension_demografica WHERE ACE.id_demografia = id_demografia) = '" + estrato + "')";

            }
            if (sexo.equals("") || sexo.equals(" ")) {

                clauseSexoACE = "";

            } else {

                clauseSexoACE = "AND ((SELECT  sexo FROM dimension_demografica WHERE id_demografia = ACE.id_demografia) = '" + sexo + "')";

            }
            if (estado_civil.equals("") || estado_civil.equals(" ")) {

                clauseEstado_civilACE = "";

            } else {

                clauseEstado_civilACE = "AND ((SELECT  estado_civil FROM dimension_demografica WHERE id_demografia = ACE.id_demografia) = '" + estado_civil + "')";

            }
            if (nivel_escolaridad.equals("") || nivel_escolaridad.equals(" ")) {

                clauseNivel_EscolaridadACE = "";

            } else {

                clauseNivel_EscolaridadACE = "AND ((SELECT  nivel_escolaridad FROM dimension_demografica WHERE id_demografia = ACE.id_demografia) = '" + nivel_escolaridad + "')";
            }

            ArrayList<String> mesesDia1 = new ArrayList();
            ArrayList<String> mesesDia2 = new ArrayList();

            for (int i = 1; i <= 12; i++) {

                if (i < 10) {
                    String mesDia1 = anio + "-0" + i + "-01";
                    String mesDia2 = anio + "-0" + i + "-31";
                    mesesDia1.add(mesDia1);
                    mesesDia2.add(mesDia2);

                } else {
                    String mesDia1 = anio + "-" + i + "-01";
                    String mesDia2 = anio + "-" + i + "-31";
                    mesesDia1.add(mesDia1);
                    mesesDia2.add(mesDia2);
                }}
            
            
            String ConsultaPromAtenCitasEspec = " (SELECT ifnull(sum(tiempo_espera)/count(tiempo_espera),0) promedio FROM atencion_cita_especializada ACE WHERE ";

            ArrayList<String> clausulas = new ArrayList();

            for (int i = 1; i <= 12; i++) {
                
                String clausePorMesCitasEspec = "";
                clausePorMesCitasEspec += "((SELECT fecha from fecha where k_fecha = ACE.id_fecha_atencion) >= '" + mesesDia1.get(i - 1) + "') AND"
                        + "((SELECT fecha from fecha WHERE k_fecha = ACE.id_fecha_atencion) <= '" + mesesDia2.get(i - 1) + "')";

                
                clausePorMesCitasEspec += clauseEstratoACE;
                clausePorMesCitasEspec += clauseSexoACE;
                clausePorMesCitasEspec += clauseEstado_civilACE;
                clausePorMesCitasEspec += clauseNivel_EscolaridadACE;
                clausePorMesCitasEspec += ")";

     
                String consulta = "";
                consulta += ConsultaPromAtenCitasEspec;
                consulta += clausePorMesCitasEspec;

                clausulas.add(consulta);
                System.out.println(consulta);
                

 
            }
            
            ArrayList<ResultSet> resultados = new ArrayList();

            for (int i = 0; i < clausulas.size(); i++) {

                Statement s = conn.createStatement();
                ResultSet resultado = s.executeQuery(clausulas.get(i));
                resultados.add(resultado);
            }
            for (int i = 0; i < resultados.size(); i++) {

                while (resultados.get(i).next()) {

                    promedios.add(Double.parseDouble(resultados.get(i).getString("promedio")));
                    System.out.println();
                }
            }

            //Dimension d = contentPane.getSize();
            //grafico = ChartFactory.createBarChart("Colombia Saludable", "Meses", "Dias", series, PlotOrientation.VERTICAL , true, true, true);

            //ChartPanel chartPanel = new ChartPanel(grafico, false);
            //this.setContentPane(chartPanel);
            //this.setVisible(true);
            //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            return promedios;



        } catch (SQLException sqlexception) {

            System.out.println(sqlexception);
        } catch (Exception exception) {

            System.out.println(exception);

        }

        return promedios;
                
            
            }
            
    public ArrayList<Double> getPromCitasPorAño(String anio, String tipoGrafica, String estrato, String sexo, String estado_civil, String nivel_escolaridad) {


        String clauseEstratoAC;
        String clauseSexoAC;
        String clauseEstado_civilAC;
        String clauseNivel_EscolaridadAC;
        String clauseEstratoACE;
        String clauseSexoACE;
        String clauseEstado_civilACE;
        String clauseNivel_EscolaridadACE;
        ArrayList<Double> promedios = new ArrayList();



        Connection conn = dw.conectar();

        try {

            if (estrato.equals("") || estrato.equals(" ")) {

                clauseEstratoAC = "";
                clauseEstratoACE = "";
            } else {

                clauseEstratoAC = "AND ((SELECT  estrato FROM dimension_demografica WHERE AC.id_demografia = id_demografia) = '" + estrato + "')";
                clauseEstratoACE = "AND ((SELECT  estrato FROM dimension_demografica WHERE ACE.id_demografia = id_demografia) = '" + estrato + "')";

            }
            if (sexo.equals("") || sexo.equals(" ")) {

                clauseSexoAC = "";
                clauseSexoACE = "";

            } else {

                clauseSexoAC = "AND ((SELECT  sexo FROM dimension_demografica WHERE id_demografia = AC.id_demografia) = '" + sexo + "')";
                clauseSexoACE = "AND ((SELECT  sexo FROM dimension_demografica WHERE id_demografia = ACE.id_demografia) = '" + sexo + "')";

            }
            if (estado_civil.equals("") || estado_civil.equals(" ")) {

                clauseEstado_civilAC = "";
                clauseEstado_civilACE = "";

            } else {

                clauseEstado_civilAC = "AND ((SELECT  estado_civil FROM dimension_demografica WHERE id_demografia = AC.id_demografia) = '" + estado_civil + "')";
                clauseEstado_civilACE = "AND ((SELECT  estado_civil FROM dimension_demografica WHERE id_demografia = ACE.id_demografia) = '" + estado_civil + "')";

            }
            if (nivel_escolaridad.equals("") || nivel_escolaridad.equals(" ")) {

                clauseNivel_EscolaridadAC = "";
                clauseNivel_EscolaridadACE = "";

            } else {

                clauseNivel_EscolaridadAC = "AND ((SELECT  nivel_escolaridad FROM dimension_demografica WHERE id_demografia = AC.id_demografia) = '" + nivel_escolaridad + "')";
                clauseNivel_EscolaridadACE = "AND ((SELECT  nivel_escolaridad FROM dimension_demografica WHERE id_demografia = ACE.id_demografia) = '" + nivel_escolaridad + "')";
            }

            ArrayList<String> mesesDia1 = new ArrayList();
            ArrayList<String> mesesDia2 = new ArrayList();

            for (int i = 1; i <= 12; i++) {

                if (i < 10) {
                    String mesDia1 = anio + "-0" + i + "-01";
                    String mesDia2 = anio + "-0" + i + "-31";
                    mesesDia1.add(mesDia1);
                    mesesDia2.add(mesDia2);

                } else {
                    String mesDia1 = anio + "-" + i + "-01";
                    String mesDia2 = anio + "-" + i + "-31";
                    mesesDia1.add(mesDia1);
                    mesesDia2.add(mesDia2);
                }
            }

            String ConsultaPromAtenCitas = "(SELECT(SELECT ifnull(sum(tiempo_espera)/count(tiempo_espera),0) FROM atencion_citas AC WHERE";
            String ConsultaPromAtenCitasEspec = " +" + " (SELECT ifnull(sum(tiempo_espera)/count(tiempo_espera),0) FROM atencion_cita_especializada ACE WHERE";
            String finConsulta = "/2 promedio);";
            ArrayList<String> clausulas = new ArrayList();

            for (int i = 1; i <= 12; i++) {

                String consulta = "";

                String clausePorMesCitas = "";
                clausePorMesCitas += "((SELECT fecha from fecha where k_fecha = AC.id_fecha_atencion) >= '" + mesesDia1.get(i - 1) + "')AND"
                        + "((SELECT fecha from fecha where k_fecha = AC.id_fecha_atencion) <= '" + mesesDia2.get(i - 1) + "')";

                clausePorMesCitas += clauseEstratoAC;
                clausePorMesCitas += clauseSexoAC;
                clausePorMesCitas += clauseEstado_civilAC;
                clausePorMesCitas += clauseNivel_EscolaridadAC;
                clausePorMesCitas += ")";

                String clausePorMesCitasEspec = "";
                clausePorMesCitasEspec += "((SELECT fecha from fecha where k_fecha = ACE.id_fecha_atencion) >= '" + mesesDia1.get(i - 1) + "') AND"
                        + "((SELECT fecha from fecha WHERE k_fecha = ACE.id_fecha_atencion) <= '" + mesesDia2.get(i - 1) + "')";

                clausePorMesCitasEspec += clauseEstratoACE;
                clausePorMesCitasEspec += clauseSexoACE;
                clausePorMesCitasEspec += clauseEstado_civilACE;
                clausePorMesCitasEspec += clauseNivel_EscolaridadACE;
                clausePorMesCitasEspec += ")";

                consulta += ConsultaPromAtenCitas;
                consulta += clausePorMesCitas;
                consulta += ConsultaPromAtenCitasEspec;
                consulta += clausePorMesCitasEspec;
                consulta += finConsulta;

                clausulas.add(consulta);
                System.out.println(consulta);
            }



            ArrayList<ResultSet> resultados = new ArrayList();

            for (int i = 0; i < clausulas.size(); i++) {

                Statement s = conn.createStatement();
                ResultSet resultado = s.executeQuery(clausulas.get(i));
                resultados.add(resultado);
            }
            for (int i = 0; i < resultados.size(); i++) {

                while (resultados.get(i).next()) {

                    promedios.add(Double.parseDouble(resultados.get(i).getString("promedio")));
                    System.out.println();
                }
            }

            //Dimension d = contentPane.getSize();
            //grafico = ChartFactory.createBarChart("Colombia Saludable", "Meses", "Dias", series, PlotOrientation.VERTICAL , true, true, true);

            //ChartPanel chartPanel = new ChartPanel(grafico, false);
            //this.setContentPane(chartPanel);
            //this.setVisible(true);
            //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            return promedios;



        } catch (SQLException sqlexception) {

            System.out.println(sqlexception);
        } catch (Exception exception) {

            System.out.println(exception);

        }

        return promedios;
    }

    public void CrearGraficoDeBarras(ArrayList<Double> series, String title, String infoX, String infoY, String columnKey) {

        DefaultCategoryDataset data = new DefaultCategoryDataset();
        String[] meses = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};


        for (int i = 0; i < series.size(); i++) {

            data.setValue(series.get(i), meses[i], columnKey);

        }


        grafico = ChartFactory.createBarChart3D(title, infoX, infoY, data, PlotOrientation.VERTICAL, true, true, true);
        ChartPanel chartPanel = new ChartPanel(grafico, false);
        this.setContentPane(chartPanel);
        this.repaint();

    }

    public void CrearGraficoDePastel(ArrayList<Double> series, String title, String infoX, String infoY) {


        Dimension d = contentPane.getSize();

        DefaultPieDataset pie = new DefaultPieDataset();
        String[] meses = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};

        for (int i = 0; i < series.size(); i++) {

            pie.setValue(meses[i], series.get(i));
        }

        grafico = ChartFactory.createPieChart(title, pie);
        ChartPanel chartPanel = new ChartPanel(grafico, false);
        this.setContentPane(chartPanel);

    }

    public static void main(String args[]) {



        PromedioTiempoCitas tp = new PromedioTiempoCitas();
        String anio = "2006";
        String tipoGrafica = "";
        String estrato = "3";
        String sexo = "F";
        String estado_civil = "Casado";
        String nivel_escolaridad = "";
        ArrayList<Double> series = tp.getPromCitasEspPorAño(anio, tipoGrafica, estrato, sexo, estado_civil, nivel_escolaridad);
        for (int i = 0; i < series.size(); i++) {

            System.out.println(series.get(i));

        }
        //tp.CrearGraficoDeBarras(series, "Colombia Saludable - Tiempo promedio de espera citas", "Meses","Dias", "Año 2006");
        tp.CrearGraficoDePastel(series, "Colombia Saludable - Tiempo promedio de espera citas atencion-citas-especializadas", "Meses", "Dias");
    }
}
